package fr.mistra.exercice.bibliotheque.dao;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import fr.mistra.exercice.bibliotheque.modeles.Livre;

public class LivreDAOMock implements LivreDAO {
	private class MockLivre {		
		public long id;
		public long idBibliotheque;
		public String titre;
		public String auteur;
		public String isbn;
		
		public MockLivre(long id, long idBibliotheque, String titre, String auteur, String isbn) {
			this.id = id;
			this.idBibliotheque = idBibliotheque;
			this.titre = titre;
			this.auteur = auteur;
			this.isbn = isbn;
		}
	}

	private List<MockLivre> liste;
	
	public LivreDAOMock() {
		liste = new ArrayList<MockLivre>(100);
		liste.add(new MockLivre(0L, 0L, "Toto1", "Mr Toto", "ISBN1"));
		liste.add(new MockLivre(1L, 0L, "Toto2", "Mr Toto", "ISBN2"));
		liste.add(new MockLivre(2L, 0L, "Toto3", "Mr Toto", "ISBN3"));
		liste.add(new MockLivre(3L, 0L, "Toto4", "Mr Toto", "ISBN4"));
		liste.add(new MockLivre(4L, 0L, "Toto5", "Mr Toto", "ISBN5"));
		liste.add(new MockLivre(5L, 1L, "Toto6", "Mr Toto", "ISBN6"));
		liste.add(new MockLivre(6L, 1L, "Toto7", "Mr Toto", "ISBN71"));
		liste.add(new MockLivre(7L, 1L, "Toto8", "Mr Toto", "ISBN8"));
		liste.add(new MockLivre(8L, 1L, "Toto9", "Mr Toto", "ISBN9"));
		liste.add(new MockLivre(9L, 1L, "Toto10", "Mr Toto", "ISBN10"));
		liste.add(new MockLivre(20L, 0L, "Pouet1", "Mme Pouet", "ISBN11"));
		liste.add(new MockLivre(21L, 0L, "Pouet2", "Mme Pouet", "ISBN12"));
		liste.add(new MockLivre(22L, 0L, "Pouet3", "Mme Pouet", "ISBN13"));
		liste.add(new MockLivre(23L, 0L, "Pouet4", "Mme Pouet", "ISBN14"));
		liste.add(new MockLivre(24L, 0L, "Pouet5", "Mme Pouet", "ISBN15"));
	}
	
	@Override
	public Livre getLivre(long idLivre) throws NoSuchIdException {
		for (MockLivre m : liste) {
			if (m.id == idLivre) {
				return new Livre(m.id, m.titre, m.auteur, m.isbn);
			}
		}
		throw new NoSuchIdException("LivreDAOMock", idLivre);
	}

	@Override
	public List<Livre> getLivres(long idBibliotheque) throws NoSuchIdException {
		List<Livre> l = new ArrayList<Livre>();
		boolean bibliothequeVue = false;
		
		for (MockLivre m : liste) {
			if (m.idBibliotheque == idBibliotheque) {
				bibliothequeVue = true;
				l.add(new Livre(m.id, m.titre, m.auteur, m.isbn));
			}
		}
		if (!bibliothequeVue) throw new NoSuchIdException("BibliothequeDAO (�mul�e par LivreDAOMock)", idBibliotheque);
		return l;
	}

	@Override
	public List<Livre> getLivres() {
		List<Livre> l = new ArrayList<Livre>();
		for (MockLivre m : liste) {
			l.add(new Livre(m.id, m.titre, m.auteur, m.isbn));
		}
		return l;
	}

	@Override
	public void supprimerLivre(long idLivre) throws DAOException, NoSuchIdException {
		Iterator<MockLivre> i = liste.iterator();
		MockLivre m;
		while ((m = i.next()) != null)
		{
			if (m.id == idLivre) {
				try {
					i.remove();
					return;	//On a trouv� l'�l�ment, on sort.
				}
				catch (UnsupportedOperationException e) {
					//On ne sait pas supprimer via cet operateur... On met un message d'erreur.
					throw new DAOException("Impossible de supprimer le livre de la liste...", e);
				}
			}
		}
		//Ici, on n'a pas trouv� l'�l�ment, il �tait donc absent de la liste...
		throw new NoSuchIdException("LivreDAOMock", idLivre);
	}

	@Override
	public void ajouterLivre(Livre livre) {
		MockLivre m = new MockLivre(-1L, -1L, livre.getTitre(), livre.getAuteur(), livre.getIsbn());
		long id = liste.get(liste.size() - 1).id + 1;
		boolean libre;
		do {
			libre = true;
		
			for (MockLivre it : liste) {
				if (it.id == id) {
					libre = false;
					break;
				}
			}
			
			if (!libre) {
				id++;
			}
		} while (!libre);
		m.id = id;
		livre.setId(id);
		liste.add(m);
	}

	@Override
	public void ajouterLivre(long idLivre, long idBibliotheque)	throws DAOException, NoSuchIdException {
		BibliothequeDAO dao = DAOFactory.getBibliothequeDAO();
		dao.getBibliotheque(idBibliotheque); //Pour verifier qu'elle existe.
		
		for (MockLivre m : liste) {
			if (m.id == idLivre) {
				liste.add(new MockLivre(m.id, idBibliotheque, m.titre, m.auteur, m.isbn));
				return;
			}
		}
		//Ici, on n'a rien trouv�.
		throw new NoSuchIdException("LivreDAOMock", idLivre);
	}

	@Override
	public void supprimerLivre(long idLivre, long idBibliotheque) throws DAOException, NoSuchIdException {
		BibliothequeDAO dao = DAOFactory.getBibliothequeDAO();
		dao.getBibliotheque(idBibliotheque); //Pour verifier qu'elle existe.

		Iterator<MockLivre> i = liste.iterator();
		MockLivre m;
		while ((m = i.next()) != null)
		{
			if (m.id == idLivre && m.idBibliotheque == idBibliotheque) {
				try {
					i.remove(); //Dans cette implementation, il peut y avoir plusieurs livres de m�me id...
					//On ne sort donc pas apr�s avoir trouv� un �l�ment, mais on parcourt toute la liste.
				}
				catch (UnsupportedOperationException e) {
					//On ne sait pas supprimer via cet operateur... On met un message d'erreur.
					throw new DAOException("Impossible de supprimer le livre de la liste...", e);
				}
			}
		}
		//Ici, on n'a pas trouv� l'�l�ment, il �tait donc absent de la liste...
		throw new NoSuchIdException("LivreDAOMock (pour la bibliotheque d'id = " + idBibliotheque + ")", idLivre);
	}
}
